import numpy as np
import matplotlib.pyplot as plt

'''
用于统计每一个维度的频率, bins代表数值在x轴的索引
show_bin_hist中输入的是有多少个桶, 以及每一个桶里面的数量有多少个
show_frequency_hist中输入的是统计数据，并要求有多少个桶，matplot自动统计每一个桶里面有多少个元素
'''


def show_bin_hist(hist):
    bins = np.arange(1, len(hist) + 1)  # 设置连续的边界值，即直方图的分布区间[0,10],[10,20]...
    # 直方图会进行统计各个区间的数值
    plt.bar(bins, hist, color='fuchsia')  # alpha设置透明度，0为完全透明

    plt.xlabel('x')
    plt.ylabel('y')
    # plt.xlim(0, 100)  # 设置x轴分布范围
    plt.savefig('hist_bin.jpg')
    plt.close()


def show_freqency_hist(data):
    # plt.xlim((-3, 3))
    # plt.ylim((0, 0.5))
    '''
    plt.hist():
    参数bins: 划分间隔，可以采用 整数来指定间隔的数量，然后由程序由间隔的数量来确定每一个间隔的范围，也可以通过列表来直接指定间隔的范围
    density的类型是 bool型，若为True,则为频率直方图，反之，频数直方图:
        频率直方图，的在统计出每一个间隔中的频数后，将频数除以总的观测数，
        就得到了每一个间隔中的频率，然后将频率除以组距（每一个间隔的宽度），
        即用纵轴来表示 频率/组距 的大小；之所以要除以组距的目的是为了让频率直方图的阶梯形折线将逼近于概率密度曲线。
        也就是说，当观测数据充分大时，频率直方图近似地反映了概率密度曲线的大致形状，在统计推断中常常由此提出对总体分布形式的假设。
        频数直方图，就是给定桶的范围，查看有多少个落到这个桶的范围中
    stacked:如果为``True''，则多个数据相互堆叠
    '''
    plt.hist(data, bins=50, density=False, stacked=False)
    plt.savefig('hist_frequency.jpg')
    plt.close()


if __name__ == '__main__':
    arr = np.array([1, 3, 2])
    show_bin_hist(arr)

    # matplotlib通过 plt.hist()方法绘制直方图
    mu, sigma = 0, 1
    sampleNum = 1024
    np.random.seed(0)
    s = np.random.normal(mu, sigma, sampleNum)
    show_freqency_hist(s)
